package com.ptrsystem.siatd.dao.implementacion;

import com.ptrsystem.siatd.beans.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public class logUserImplement implements com.ptrsystem.siatd.dao.interfaces.logUserInterface {

    @Autowired
    private DataSource dataSource;

    @Override
    public List<Map> verificaLogUser(String User, String Pass) {
        JdbcTemplate jdbctemplate = new JdbcTemplate(dataSource);
        List<Map> lista = jdbctemplate.query("select top(1) acc.*,reg.*,uPInt.*,uDInt.* from TD_ACCESO_USUARIO acc join TD_REG_USUARIO reg on acc.DNI_USUARIO=reg.DNI_USUARIO "
                + "join TD_ASIG_USU_DATOS asig on asig.DNI_USUARIO=reg.DNI_USUARIO "
                + " join TD_UNID_PADRE_INTERNO uPInt on uPInt.COD_UNI_PAD_INTER= asig.COD_UNID_PAD_INTER "
                + " join TD_UNID_DEP_INTERNO uDInt on uDInt.COD_UNID_DEP_INT=asig.COD_UNID_DEP_INT "
                + " where acc.DNI_USUARIO=? and acc.CONTRASENIA_ACCESO=?",
                new Object[]{User, Pass}, new rowMapper());
        return lista;
    }

    @Override
    @Transactional
    public boolean getRegistroSistema(String idUsuario, HttpServletRequest req) {
        JdbcTemplate template = new JdbcTemplate(this.dataSource);
        HttpSession sesion = req.getSession(false);
        Date timeSesion = new Date(sesion.getLastAccessedTime());
        //convertir date a String para la suma y format para los ceros ala izquierda
        Formatter mesfmt = new Formatter();
        String mesString = String.valueOf(timeSesion.getMonth());
        int mes = Integer.parseInt(mesString) + 1;
        mesfmt.format("%02d", mes);
        Formatter diafmt = new Formatter();
        diafmt.format("%02d", timeSesion.getDate());
        String anioString = String.valueOf(timeSesion.getYear());
        int anio = Integer.parseInt(anioString) + 1900;
        System.out.println(diafmt + "-" + mesfmt + "-" + anio);
        //generar la hora con ceros a la izquierda
        Formatter horaF = new Formatter();
        horaF.format("%02d", timeSesion.getHours());
        Formatter minutosF = new Formatter();
        minutosF.format("%02d", timeSesion.getMinutes());
        Formatter segundosF = new Formatter();
        segundosF.format("%02d", timeSesion.getSeconds());
        template.update("insert into TD_LOG_ACCESO (COD_ACCESO,HORA_ACCESO,FEC_ACCESO,HOST_ACCESO,IP_HOST)"
                + " values(?,?,?,?,?)", idUsuario,
                horaF + ":" + minutosF + ":" + segundosF,
                diafmt + "-" + mesfmt + "-" + anio,
                req.getRemoteHost(),
                req.getRemoteAddr()
        );
        return true;
    }

    public class rowMapper implements RowMapper<Map> {

        @Override
        public Map mapRow(ResultSet rs, int i) throws SQLException {
            Map mapa = new HashMap();
            mapa.put("dat_usu", rs.getString("PRIM_APE_USU") + " " + rs.getString("SEGUN_APE_USU") + " - " + rs.getString("PRE_NOM_USU"));
            mapa.put("dni", rs.getString("DNI_USUARIO"));
            mapa.put("cod_acc", rs.getString("COD_ACCESO"));
            mapa.put("nomUniPadInt", rs.getString("NOM_UNI_PAD_INTER"));
            mapa.put("nomUniDepInt", rs.getString("NOM_DEP_INTERNO"));
            return mapa;
//            Map map = new HashMap();
            //            map.put("usuario", rs.getString("nick"));
            //            map.put("password", rs.getString("pass"));
            //            return map;
        }
    }
}
